package com.wll.design.单例.懒汉;

/**
 * @ClassName: DoubleCheckSingleton.java
 * @author: wanglulu
 * @version: 1.0.0
 * @Description: 双重校验锁
 * <p>
 * 双重校验锁实现的单例模式，综合了懒汉式和饿汉式两者的优缺点。
 * 代码例子中，在synchronized关键字内外都加了一层if条件判断，
 * 这样既保证了线程安全，又比直接上锁提高了执行效率，还节省了内存空间。
 * @createTime: 2021/11/25 16:38
 */
public class DoubleCheckSingleton {

    public volatile static DoubleCheckSingleton singleton;

    public DoubleCheckSingleton() {
    }


    /**
     * 双重校验锁实现的单例模式，综合了懒汉式和饿汉式两者的优缺点。
     * 代码例子中，在synchronized关键字内外都加了一层if条件判断，
     * 这样既保证了线程安全，又比直接上锁提高了执行效率，还节省了内存空间。
     *
     * 内存可见性问题等
     *
     * @return
     */
    public static DoubleCheckSingleton getSingleton() {
        if (singleton == null) {
            synchronized (DoubleCheckSingleton.class) {
                if (singleton == null) {
                    singleton = new DoubleCheckSingleton();
                }
            }
        }
        return singleton;
    }


}
